AWS CloudFormation テンプレートリファレンス – ヘルパースクリプト/cfn-init
- Template Reference - AWS CloudFormation
- CloudFormation | 特集カテゴリー | Developers.IO
- AWS CloudFormationテンプレートリファレンス | シリーズ | Developers.IO
AWS CloudFormationテンプレートリファレンス、第4弾は『ヘルパースクリプト(Helper Scripts)』。EC2インスタンス上で色々な事が出来るこれまた便利なツール群です。当エントリではヘルパースクリプトに関する全体像と、ヘルパースクリプトのうちの1つ、cfn-initについてご紹介。
CloudFormationヘルパースクリプトリファレンス
AWS CloudFormationでは、スタックの一部として作成したAmazon EC2インスタンス上でソフトウェアをインストールし、サービスを開始出来るようにPythonのヘルパースクリプトのセットを提供しています。作成したテンプレートから直接、ヘルパースクリプトを呼ぶ事が出来ます。スクリプトは、同じテンプレートで定義したリソースやメタデータと連動して動作します。ヘルパースクリプトは、スタック作成プロセスの一環として、Amazon EC2インスタンスで実行されます。
ヘルパースクリプトは、Amazon Linux AMIの最新バージョンにプリインストールされています。また、利用出来ます。他のUnix/LinuxのAMIで利用するために、Amazon Linuxのyumリポジトリからも利用出来ます。
現在、AWS CloudFormationでは、以下のヘルパースクリプトを提供しています。
- cfn-init:リソースメタデータを取得、パッケージのインストール、ファイルを作成しサービスを開始する為に使用します。
- cfn-signal:スタック内でアプリケーションが準備出来ている状態になると他のリソースと同期する事が出来るようになるCloudFormation WaitConditionを通知する簡単なラッパーです。
- cfn-get-metadata:リソースに対して定義された全てのメタデータや、特定のキーやリソースメタデータのサブツリーへのパスの取得を簡単に出来るラッパースクリプトです。
- cfn-hup:メタデータへの更新をチェックし、変更が検出されたときに、カスタムフックを実行するデーモンです。
これらのスクリプトは、最新Amazon Linux AMIバージョンの/opt/aws/binにデフォルトでインストールされています。また、他のLinux/Unixディストリビューション用のRPM等を介するのと同じように、以前のAmazon Linux AMIからでもAmazon Linux AMIのyumリポジトリ経由で利用出来ます。
スクリプトは、WindowsのPythonを使用してMicrosoft Windows上にインストールする事ができます。スクリプトは、デフォルトでは実行されません。特定のヘルパースクリプトを実行する為の呼び出しを含める必要があります。
AWS CloudFormationのヘルパースクリプトは、以下のサイトから入手出来ます。
- Amazon Linux AMIの最新バージョンには、AWS CloudFormationヘルパースクリプトがデフォルトで/opt/aws/binにインストールされています。
- AWSヘルパースクリプトは、以前のバージョンからでもAmazon Linux AMI yumリポジトリ(パッケージ名:aws-cfn-bootstrap)経由で利用出来ます。
- ヘルパースクリプトは、以下の形式でも用意されています。
- https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.amzn1.noarch.rpm (RPM形式)
- https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz (gz形式:Pythonのeasy-install経由でインストール)
- https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.zip (zipアーカイブ形式)
- https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.msi (Microsoft Windows MSI形式)
- スクリプトのソースは、Amazon Linux AMI以外のLinuxディストリビューションに使用する事ができます。https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.src.rpmで利用可能です。
cfn-init
cfn-initヘルパースクリプトは、AWS::CloudFormation::Initのキーからテンプレートメタデータを読み取り、内容に応じて以下の動作を行います。
- CloudFormationからメタデータを取得し、解析
- パッケージのインストール
- ディスクにファイルを書き込む
- サービスの有効/無効化、起動/停止
既存のファイルを更新するためにcfn-initを使う場合、cfn-initはオリジナルファイルのコピー(同じディレクトリ内に、拡張子.bakの名前で)を取ります。 例えば、/path/to/file_nameを更新する場合、この動作は2つのファイルを存在させる事になります:/path/to/file_name.bakはオリジナルファイル:/path/to/file_nameの内容を含み、且つ更新された内容も含んでいます。
テンプレートメタデータの詳細については、AWS::CloudFormation::Initをご参照ください。
cfn-initは認証情報を必要としません。なので--access-key、--secret-key、--role又は--credential-fileといったオプション情報を使う事もありません。
シンタックス
cfn-init --stack|-s stack.name.or.id \ --resource|-r logical.resource.id \ --region region --access-key access.key \ --secret-key secret.key \ --role rolename\ --credential-file|-f credential.file \ --configsets|-c config.sets \ --url|-u service.url \ -v
オプション情報
名前 | 詳細 | 必須 |
---|---|---|
-s, --stack | スタック名。String型、デフォルト値は無し。 例:-s { "Ref" : "AWS::StackName" }, |
◯ |
-r, --resource | メタデータを含むリソースの論理リソースID。String型。 例:-r WebServerHost |
◯ |
--region | CloudFormationのURLから導出されるリージョンの情報。String型、デフォルト値無し。 例:--region ", { "Ref" : "AWS::Region" }, |
ー |
--access-key | CloudFormation上でDescribeStackResourceを呼び出す権限を持つアカウントのAWSアクセスキー情報。String型。 ※条件:Credentialファイルのパラメータは、このパラメータよりも優先されます。 |
△ |
--secret-key | 指定されたアクセスキーに対応するAWS秘密鍵情報。String型。 ※条件:Credentialファイルのパラメータは、このパラメータよりも優先されます。 |
△ |
--role | IAMロール名。 ※条件:Credentialファイルのパラメータは、このパラメータよりも優先されます。 |
△ |
-f, --credential-file | シークレットキーとアクセスキーの情報を含むファイル名。String型。 ※条件:このファイルパラメータ情報は--role、--access-key、--secret-keyパラメータに優先します。 |
△ |
-c, --configsets | カンマ区切りの実行リスト(実行順)。String型、デフォルト値:default。 | ー |
-u, --url | CloudFormationサービスURL。String型。 | ー |
-v | より詳細な出力を行います。これは、初期化に失敗したcfn-initのケースをデバッグするのに便利です。
注意: |
ー |
まとめ
AWS CloudFormationのヘルパースクリプト、cfn-initについては下記エントリで都元さんが解説されています。
都元さんの上記エントリ→当エントリで参照したリファレンス情報と見て来ましたが、このcfn-init、更にはCloudFormationのテンプレート情報:AWS::CloudFormation::Initを読み進めて行く事でより詳しくこの辺りの仕組みを知る事が出来そうです。ヘルパースクリプトの内容に関しては、ドキュメントのリファレンスページと併せて関連するテンプレートのページも見て行きたいと思います。